import pandas as pd
from sklearn.model_selection import train_test_split # 划分测试集和训练集
from sklearn.naive_bayes import GaussianNB  # 调入贝叶斯分类器
from sklearn.model_selection import cross_val_score # 模型验证：交叉检验

# 导入数据
df = pd.read_csv("titanic.csv")
print("查看前5行：")
print(df.head())
# 去掉一些自变量
df.drop(['n_siblings_spouses','parch','deck','alone','embark_town'],axis='columns',inplace=True)
print("去掉一些自变量之后的前5行：")
print(df.head())
# 对数据进行分析
inputs = df.drop('Survived',axis='columns')  # 把df去掉survived变量 组成的新的自变量数据集保存在inputs中
target = df.Survived    # 把df的survived变量当作 标签 存为target
# 字符型属性变为0-1便于区分
dummies = pd.get_dummies(inputs.Sex)  # 将原本不好区分的数据进行再次打标签区分，从而得到更细的数据 这里也就是把男女变成 1-0
print("把Sex属性变为1-0来区分，查看前5行：")
print(dummies.head(5))
# 在水平方向上连接两个矩阵
print("在水平方向上连接两个矩阵：")
inputs = pd.concat([inputs,dummies],axis='columns')
print(inputs.head(5))
# 删除 Sex 和 male 两类列
print("删除Sex和male两列：")
inputs.drop(['Sex','male'],axis='columns',inplace=True)
print(inputs.head(5))

# 查看哪一列有空值，需要进行数据处理
print("查看哪一列有空值，需要进行数据处理")
print(inputs.columns[inputs.isna().any()])
# 在空值的地方填入平均值
print("在空值的那一列的空值填入平均值")
inputs.Age = inputs.Age.fillna(inputs.Age.mean())
print(inputs.head(5))

# 数据划分测试集和训练集
X_train, X_test, y_train, y_test = train_test_split(inputs,target,test_size=0.3)
# 选取贝叶斯分类器进行训练
model = GaussianNB()
model.fit(X_train,y_train)
# 获得model的得分
print("训练结束，模型的得分为：")
print(model.score(X_test,y_test))

# 使用训练好的模型对前10个test 数据进行预测
print("使用训练好的模型对前10个test 数据进行预测")
result = model.predict(X_test[0:10])
print("预测结果为：" + str(result))
# 查看预测的详细概率情况
print("查看预测的详细情况：")
result_all = model.predict_proba(X_test[:10]) # 函数得到的结果是一个多维数组，如果是二分类，则是二维数组，第一列为样本预测为0的概率，第二列为样本预测为1的概率。
print(result_all)

# 对模型进行交叉验证计算分数
model_score = cross_val_score(GaussianNB(),X_train, y_train, cv=5)
print("模型的预测概率得分为：" + str(model_score))








